// 柯里化函数的实现 hyCurrying
function hyCurrying(fn) {
  function curried(...args) {
    // 判断当前已经接收的参数个数(args.length)，和需要运行的函数所需要的参数个数(fn.length)是否一致
    if (args.length >= fn.length) {
      // 当前已经传入的参数 >= 需要的参数时，执行函数
      return fn.apply(this, args) // 保持 this 的绑定
    } else {
      // 没有到达需要的参数个数时，返回新的函数，继续接收参数
      function curried2(...args2) {
        // 接收到参数后，递归调用 curried 来判断参数个数是否达到需要的个数
        return curried.apply(this, [...args, ...args2])
      }
      return curried2
    }
  }
  return curried
}


function sum(n1, n2, n3) {
  return n1 + n2 + n3
}

let sumCurried = hyCurrying(sum)

console.log(sumCurried(10)(20)(30)) // 60
console.log(sumCurried(10, 20)(30)) // 60
console.log(sumCurried(10)(20, 30)) // 60
console.log(sumCurried(10, 20, 30)) // 60